/**
 * DialogueBD.java    01/02/2012
 */

package l3.info.projetJava.utilitaires;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.log4j.Logger;

/**
 * Classe utilitaire permettant de faire différentes
 * opérations sur une base de données
 * @author Loic Martinez
 * @version 1.0
 */

public class DialogueBD {

    /** Logger */
    private static Logger logger = Logger.getLogger(DialogueBD.class);
    
    /**
     * Permet de se connecter à une base de données postgresql
     * @param url, l'url de la base de données
     * @param user, l'utilisateur de la base de données
     * @param passwd, le mot de passe de l'utilisateur
     * @return conn, la connexion à la base de données
     */
    public static Connection connexionSQL(String url,
            String user, String passwd) {
        Connection conn = null;

        try {
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(url, user, passwd);
        } catch (ClassNotFoundException e) {
            logger.error("DialogueBD.connexionSQL() : ClassNotFoundException");
        } catch (SQLException ex) {
            logger.error("DialogueBD.connexionSQL() : SQLException");
        }

        return conn;
    }

    /**
     * Permet d'ajouter un n-uplet dans une table
     * @param conn, la connexion à la base de données
     * @param table, la table dans laquelle on veut ajouter un n-uplet
     * @param valeurs, les valeurs à ajouter séparés par une virgule
     * @throws SQLException, si problème de connexion
     */
    public static void insertInto(Connection conn, String table,
            String valeurs) throws SQLException {

        String requete = "INSERT INTO " + table + " "
                + "VALUES(" + valeurs + ");";

        // Exécution de la requête
        Statement state = conn.createStatement();
        state.executeUpdate(requete);

        state.close();
    }

    /**
     * Permet de supprimer un n-uplet dans une table
     * @param conn, la connexion à la base de données
     * @param table, la table dans laquelle on veut ajouter un n-uplet
     * @param condition, la condition de la clause WHERE
     *        (ne pas finir pas ';')
     */
    public static void deleteFrom(Connection conn, String table,
            String condition) {

        String requete = "DELETE FROM " + table + " "
                + "WHERE " + condition + ";";

        try {
            // Exécution de la requête
            Statement state = conn.createStatement();
            state.executeUpdate(requete);

            state.close();

        } catch (SQLException e) {
            logger.error("DialogueBD.deleteFrom() : SQLException");
        }
    }

    /**
     * Permet de faire un select et ramène un seul élément
     * de type String
     * @param conn, la connexion à la base de données
     * @param table, la table sur laquelle on fait le select
     * @param attribut, la valeur de l'attribut à récupérer
     * @param condition, la condition du WHERE
     */
    public static String selectOneElementStringType(Connection conn,
            String table, String attribut, String condition) {

        String res = null;

        String requete = "SELECT " + attribut
                + " FROM " + table
                + " WHERE " + condition + ";";

        try {
            // Exécution de la requête
            Statement state = conn.createStatement();
            ResultSet result = state.executeQuery(requete);
            // ResultSetMetaData result = state.executeQuery(requete);

            // Un résultat trouvé
            if (result.next()) {
                res = result.getString(attribut);

                result.close();
                state.close();
            }

            result.close();
            state.close();

        } catch (SQLException e) {
            logger.error("DialogueBD.selectOneElementStringType() : SQLException");
        }

        return res;
    }

    /**
     * Permet de faire un select et ramène un seul élément
     * de type String
     * @param conn, la connexion à la base de données
     * @param table, la table sur laquelle on fait le select
     * @param attribut, la valeur de l'attribut à récupérer
     * @param condition, la condition du WHERE
     * @return le résultat entier -1 si erreur,
     *                            >= 0 sinon
     */
    public static int countSQL(Connection conn,
            String table, String attribut) {

        int res = -1;

        String requete = "SELECT COUNT(" + attribut + ") AS numberOfMessages "
                + "FROM " + table + ";";

        try {
            // Exécution de la requête
            Statement state = conn.createStatement();
            ResultSet result = state.executeQuery(requete);

            // Un résultat trouvé
            if (result.next()) {
                
                res = result.getInt("numberOfMessages");

                result.close();
                state.close();
            }

            result.close();
            state.close();

        } catch (SQLException e) {
            logger.error("DialogueBD.countSQL() : SQLException");
        }

        return res;
    }
}
